package controllers

import (
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"html/template"
	"net/url"
	"strings"
	"xianzhi/service"
	"xianzhi/utils"
	"xianzhi/utils/wechat"
)

// 会员相关
type UserController struct {
	BaseController
}

func (c *UserController) Index() {
	c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML())
	c.TplName = "user/index.html"
}

func (c *UserController) Login() {
	c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML())
	c.TplName = "user/login.html"
}

func (c *UserController) DoLogin() {
	var res *utils.ResJsonStruct
	input := c.Input()
	if len(input["phone"][0]) <= 0 {
		res = utils.ResJson(0, "请输入手机号", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if len(input["password"][0]) <= 0 {
		res = utils.ResJson(0, "请输入密码", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	p := map[string]interface{}{}
	p["phone"] = input["phone"][0]
	user := service.GetUserInfo(p)
	if user.Id <= 0 {
		res = utils.ResJson(0, "登录失败，手机号或密码不正确", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if !strings.EqualFold(utils.Encode(input["password"][0]), user.Password) {
		res = utils.ResJson(0, "登录失败，手机号或密码不正确", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if user.Status == 0 {
		res = utils.ResJson(0, "登录失败，此手机号已被禁用", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	c.SetSession("userId", user.Id)
	res = utils.ResJson(1, "登录成功", "")
	c.Data["json"] = res
	c.ServeJSON()
}

func (c *UserController) Register() {
	c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML())
	c.TplName = "user/register.html"
}

func (c *UserController) DoRegister() {
	var res *utils.ResJsonStruct
	info := c.GetSession("wechatUserInfo")
	var wechatUserInfo wechat.WechatUserInfoByCode
	if info == nil {
		res = utils.ResJson(0, "未检测到您的微信信息，请刷新页面", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	err := json.Unmarshal([]byte(info.(string)), &wechatUserInfo)
	if err != nil {
		res = utils.ResJson(0, "您的微信信息异常，请刷新页面", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	input := c.Input()
	if len(input["phone"][0]) <= 0 {
		res = utils.ResJson(0, "请输入手机号", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if !utils.IsMobile(input["phone"][0]) {
		res = utils.ResJson(0, "请输入正确的手机号", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if len(input["verify_code"][0]) <= 0 {
		res = utils.ResJson(0, "请输入验证码", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}

	verifyRes, verifyMsg := service.DoCheckVerifyCode(input["phone"][0], input["verify_code"][0])
	if !verifyRes {
		res = utils.ResJson(0, verifyMsg, "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}

	p := map[string]interface{}{}
	p["phone"] = input["phone"][0]
	user := service.GetUserInfo(p)
	if user.Id > 0 {
		res = utils.ResJson(0, "此手机号已被使用，请更换其他手机号", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}

	if len(input["school_name"][0]) <= 0 {
		res = utils.ResJson(0, "请输入学校", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if len(input["password"][0]) <= 0 {
		res = utils.ResJson(0, "请输入密码", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if len(input["repeat_password"][0]) <= 0 {
		res = utils.ResJson(0, "请再次输入密码", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if !strings.EqualFold(input["password"][0], input["repeat_password"][0]) {
		res = utils.ResJson(0, "两次密码输入不一致", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	input["status"] = []string{"1"}

	p = map[string]interface{}{}
	p["openId"] = wechatUserInfo.Openid
	user = service.GetUserInfo(p)
	input["open_id"] = []string{wechatUserInfo.Openid}
	input["union_id"] = []string{wechatUserInfo.Unionid}
	input["nick_name"] = []string{wechatUserInfo.Nickname}
	input["head_img_url"] = []string{wechatUserInfo.Headimgurl}
	if user.Id > 0 {
		delete(input, "repeat_password")
		delete(input, "verify_code")
		input["id"] = []string{fmt.Sprintf("%d", user.Id)}
		_, err = service.EditUser(input)
	} else {
		_, err = service.AddUser(input)
	}

	if err != nil {
		res = utils.ResJson(0, "注册失败", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	res = utils.ResJson(1, "注册成功", "")
	c.Data["json"] = res
	c.ServeJSON()
}

func (c *UserController) FindPassword() {
	c.Data["xsrfdata"] = template.HTML(c.XSRFFormHTML())
	c.TplName = "user/find_password.html"
}

func (c *UserController) DoFindPassword() {
	var res *utils.ResJsonStruct
	input := c.Input()
	if len(input["phone"][0]) <= 0 {
		res = utils.ResJson(0, "请输入手机号", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if !utils.IsMobile(input["phone"][0]) {
		res = utils.ResJson(0, "请输入正确的手机号", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if len(input["verify_code"][0]) <= 0 {
		res = utils.ResJson(0, "请输入验证码", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	verifyRes, verifyMsg := service.DoCheckVerifyCode(input["phone"][0], input["verify_code"][0])
	if !verifyRes {
		res = utils.ResJson(0, verifyMsg, "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	p := map[string]interface{}{}
	p["phone"] = input["phone"][0]
	user := service.GetUserInfo(p)
	if user.Id <= 0 {
		res = utils.ResJson(0, "此手机号还未注册", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if len(input["password"][0]) <= 0 {
		res = utils.ResJson(0, "请输入新密码", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if len(input["repeat_password"][0]) <= 0 {
		res = utils.ResJson(0, "请再次输入新密码", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	if !strings.EqualFold(input["password"][0], input["repeat_password"][0]) {
		res = utils.ResJson(0, "两次密码输入不一致", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	editInput := url.Values{
		"id": {fmt.Sprintf("%d", user.Id)},
		"password": {input["password"][0]},
	}
	_, err := service.EditUser(editInput)
	if err != nil {
		res = utils.ResJson(0, "密码修改失败", "")
		c.Data["json"] = res
		c.ServeJSON()
		return
	}
	res = utils.ResJson(1, "密码修改成功", "")
	c.Data["json"] = res
	c.ServeJSON()
}

func (c *UserController) Logout() {
	c.DestroySession()
	c.Redirect(beego.URLFor("controllers.UserController.Login"), 302)
}